home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / ultqsrc.zip / MISC.QC < prev    next >
Text File  |  1996-09-21  |  16KB  |  682 lines

  1.  
  2. /*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4)
  3. Used as a positional target for spotlights, etc.
  4. */
  5. void() info_null =
  6. {
  7.     remove(self);
  8. };
  9.  
  10. /*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4)
  11. Used as a positional target for lightning.
  12. */
  13. void() info_notnull =
  14. {
  15. };
  16.  
  17. //============================================================================
  18.  
  19. float START_OFF = 1;
  20.  
  21. void() light_use =
  22. {
  23.     if (self.spawnflags & START_OFF)
  24.     {
  25.         lightstyle(self.style, "m");
  26.         self.spawnflags = self.spawnflags - START_OFF;
  27.     }
  28.     else
  29.     {
  30.         lightstyle(self.style, "a");
  31.         self.spawnflags = self.spawnflags + START_OFF;
  32.     }
  33. };
  34.  
  35. /*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  36. Non-displayed light.
  37. Default light value is 300
  38. Default style is 0
  39. If targeted, it will toggle between on or off.
  40. */
  41. void() light =
  42. {
  43.     if (!self.targetname)
  44.     {    // inert light
  45.         remove(self);
  46.         return;
  47.     }
  48.     
  49.     if (self.style >= 32)
  50.     {
  51.         self.use = light_use;
  52.         if (self.spawnflags & START_OFF)
  53.             lightstyle(self.style, "a");
  54.         else
  55.             lightstyle(self.style, "m");
  56.     }
  57. };
  58.  
  59. /*QUAKED light_fluoro (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  60. Non-displayed light.
  61. Default light value is 300
  62. Default style is 0
  63. If targeted, it will toggle between on or off.
  64. Makes steady fluorescent humming sound
  65. */
  66. void() light_fluoro =
  67. {
  68.     if (self.style >= 32)
  69.     {
  70.         self.use = light_use;
  71.         if (self.spawnflags & START_OFF)
  72.             lightstyle(self.style, "a");
  73.         else
  74.             lightstyle(self.style, "m");
  75.     }
  76.     
  77.     precache_sound ("ambience/fl_hum1.wav");
  78.     ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
  79. };
  80.  
  81. /*QUAKED light_fluorospark (0 1 0) (-8 -8 -8) (8 8 8)
  82. Non-displayed light.
  83. Default light value is 300
  84. Default style is 10
  85. Makes sparking, broken fluorescent sound
  86. */
  87. void() light_fluorospark =
  88. {
  89.     if (!self.style)
  90.         self.style = 10;
  91.  
  92.     precache_sound ("ambience/buzz1.wav");
  93.     ambientsound (self.origin, "ambience/buzz1.wav", 0.5, ATTN_STATIC);
  94. };
  95.  
  96. /*QUAKED light_globe (0 1 0) (-8 -8 -8) (8 8 8)
  97. Sphere globe light.
  98. Default light value is 300
  99. Default style is 0
  100. */
  101. void() light_globe =
  102. {
  103.     precache_model ("progs/s_light.spr");
  104.     setmodel (self, "progs/s_light.spr");
  105.     makestatic (self);
  106. };
  107.  
  108. void() FireAmbient =
  109. {
  110.     precache_sound ("ambience/fire1.wav");
  111. // attenuate fast
  112.     ambientsound (self.origin, "ambience/fire1.wav", 0.5, ATTN_STATIC);
  113. };
  114.  
  115. /*QUAKED light_torch_small_walltorch (0 .5 0) (-10 -10 -20) (10 10 20)
  116. Short wall torch
  117. Default light value is 200
  118. Default style is 0
  119. */
  120. void() light_torch_small_walltorch =
  121. {
  122.     precache_model ("progs/flame.mdl");
  123.     setmodel (self, "progs/flame.mdl");
  124.     FireAmbient ();
  125.     makestatic (self);
  126. };
  127.  
  128. /*QUAKED light_flame_large_yellow (0 1 0) (-10 -10 -12) (12 12 18)
  129. Large yellow flame ball
  130. */
  131. void() light_flame_large_yellow =
  132. {
  133.     precache_model ("progs/flame2.mdl");
  134.     setmodel (self, "progs/flame2.mdl");
  135.     self.frame = 1;
  136.     FireAmbient ();
  137.     makestatic (self);
  138. };
  139.  
  140. /*QUAKED light_flame_small_yellow (0 1 0) (-8 -8 -8) (8 8 8) START_OFF
  141. Small yellow flame ball
  142. */
  143. void() light_flame_small_yellow =
  144. {
  145.     precache_model ("progs/flame2.mdl");
  146.     setmodel (self, "progs/flame2.mdl");
  147.     FireAmbient ();
  148.     makestatic (self);
  149. };
  150.  
  151. /*QUAKED light_flame_small_white (0 1 0) (-10 -10 -40) (10 10 40) START_OFF
  152. Small white flame ball
  153. */
  154. void() light_flame_small_white =
  155. {
  156.     precache_model ("progs/flame2.mdl");
  157.     setmodel (self, "progs/flame2.mdl");
  158.     FireAmbient ();
  159.     makestatic (self);
  160. };
  161.  
  162. //============================================================================
  163.  
  164.  
  165. /*QUAKED misc_fireball (0 .5 .8) (-8 -8 -8) (8 8 8)
  166. Lava Balls
  167. */
  168.  
  169. void() fire_fly;
  170. void() fire_touch;
  171. void() misc_fireball =
  172. {
  173.     
  174.     precache_model ("progs/lavaball.mdl");
  175.     self.classname = "fireball";
  176.     self.nextthink = time + (random() * 5);
  177.     self.think = fire_fly;
  178.     if (!self.speed)
  179.         self.speed == 1000;
  180. };
  181.  
  182. void() fire_fly =
  183. {
  184. local entity    fireball;
  185.  
  186.     fireball = spawn();
  187.         fireball.health = 5;
  188.         fireball.takedamage = DAMAGE_AIM;
  189.         fireball.th_die = FireDie;
  190.         fireball.solid = SOLID_BBOX;
  191.         fireball.movetype = MOVETYPE_BOUNCE;
  192.     fireball.velocity = '0 0 1000';
  193.     fireball.velocity_x = (random() * 100) - 50;
  194.     fireball.velocity_y = (random() * 100) - 50;
  195.     fireball.velocity_z = self.speed + (random() * 200);
  196.         fireball.classname = "fireball";
  197.     setmodel (fireball, "progs/lavaball.mdl");
  198.         setsize (fireball, '-6 -6 -6', '6 6 6');
  199.     setorigin (fireball, self.origin);
  200.     fireball.nextthink = time + 5;
  201.         fireball.active = 0.25;
  202.         fireball.think = FireDie;
  203.         fireball.touch = FireTouch;
  204.     
  205.     self.nextthink = time + (random() * 5) + 3;
  206.     self.think = fire_fly;
  207. };
  208.  
  209.  
  210. void() fire_touch =
  211. {
  212.     T_Damage (other, self, self, 20);
  213.     remove(self);
  214. };
  215.  
  216. //============================================================================
  217.  
  218.  
  219. void() barrel_explode =
  220. {
  221.     self.takedamage = DAMAGE_NO;
  222.     self.classname = "explo_box";
  223.     // did say self.owner
  224.         T_RadiusDamage (self, self.enemy, 160, world);
  225.     sound (self, CHAN_VOICE, "weapons/r_exp3.wav", 1, ATTN_NORM);
  226.     particle (self.origin, '0 0 0', 75, 255);
  227.  
  228.     self.origin_z = self.origin_z + 32;
  229.     BecomeExplosion ();
  230. };
  231.  
  232.  
  233.  
  234. /*QUAKED misc_explobox (0 .5 .8) (0 0 0) (32 32 64)
  235. TESTING THING
  236. */
  237.  
  238. void() misc_explobox =
  239. {
  240.     local float    oldz;
  241.     
  242.     self.solid = SOLID_BBOX;
  243.         self.movetype = MOVETYPE_STEP;
  244.     precache_model ("maps/b_explob.bsp");
  245.     setmodel (self, "maps/b_explob.bsp");
  246.     precache_sound ("weapons/r_exp3.wav");
  247.     self.health = 20;
  248.     self.th_die = barrel_explode;
  249.     self.takedamage = DAMAGE_AIM;
  250.         self.touch = CorpseMove;
  251.     self.origin_z = self.origin_z + 2;
  252.     oldz = self.origin_z;
  253.     droptofloor();
  254.     if (oldz - self.origin_z > 250)
  255.     {
  256.         dprint ("item fell out of level at ");
  257.         dprint (vtos(self.origin));
  258.         dprint ("\n");
  259.         remove(self);
  260.     }
  261. };
  262.  
  263.  
  264.  
  265.  
  266. /*QUAKED misc_explobox2 (0 .5 .8) (0 0 0) (32 32 64)
  267. Smaller exploding box, REGISTERED ONLY
  268. */
  269.  
  270. void() misc_explobox2 =
  271. {
  272.     local float    oldz;
  273.     
  274.     self.solid = SOLID_BBOX;
  275.     self.movetype = MOVETYPE_NONE;
  276.     precache_model2 ("maps/b_exbox2.bsp");
  277.     setmodel (self, "maps/b_exbox2.bsp");
  278.     precache_sound ("weapons/r_exp3.wav");
  279.     self.health = 20;
  280.     self.th_die = barrel_explode;
  281.     self.takedamage = DAMAGE_AIM;
  282.  
  283.     self.origin_z = self.origin_z + 2;
  284.     oldz = self.origin_z;
  285.     droptofloor();
  286.     if (oldz - self.origin_z > 250)
  287.     {
  288.         dprint ("item fell out of level at ");
  289.         dprint (vtos(self.origin));
  290.         dprint ("\n");
  291.         remove(self);
  292.     }
  293. };
  294.  
  295. //============================================================================
  296.  
  297. float SPAWNFLAG_SUPERSPIKE    = 1;
  298. float SPAWNFLAG_LASER = 2;
  299.  
  300. void(vector org, vector vec) LaunchLaser;
  301.  
  302. void() spikeshooter_use =
  303. {
  304.     if (self.spawnflags & SPAWNFLAG_LASER)
  305.     {
  306.         sound (self, CHAN_VOICE, "enforcer/enfire.wav", 1, ATTN_NORM);
  307.         LaunchLaser (self.origin, self.movedir);
  308.     }
  309.     else
  310.     {
  311.         sound (self, CHAN_VOICE, "weapons/spike2.wav", 1, ATTN_NORM);
  312.                 launch_spike (self.origin - '0 0 16', self.movedir,self,"superspike",0);
  313.         newmis.velocity = self.movedir * 500;
  314.         if (self.spawnflags & SPAWNFLAG_SUPERSPIKE)
  315.                         newmis.touch = spike_touch;
  316.     }
  317. };
  318.  
  319. void() shooter_think =
  320. {
  321.     spikeshooter_use ();
  322.     self.nextthink = time + self.wait;
  323.     newmis.velocity = self.movedir * 500;
  324. };
  325.  
  326.  
  327. /*QUAKED trap_spikeshooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
  328. When triggered, fires a spike in the direction set in QuakeEd.
  329. Laser is only for REGISTERED.
  330. */
  331.  
  332. void() trap_spikeshooter =
  333. {
  334.     SetMovedir ();
  335.     self.use = spikeshooter_use;
  336.     if (self.spawnflags & SPAWNFLAG_LASER)
  337.     {
  338.         precache_model2 ("progs/laser.mdl");
  339.         
  340.         precache_sound2 ("enforcer/enfire.wav");
  341.         precache_sound2 ("enforcer/enfstop.wav");
  342.     }
  343.     else
  344.         precache_sound ("weapons/spike2.wav");
  345. };
  346.  
  347.  
  348. /*QUAKED trap_shooter (0 .5 .8) (-8 -8 -8) (8 8 8) superspike laser
  349. Continuously fires spikes.
  350. "wait" time between spike (1.0 default)
  351. "nextthink" delay before firing first spike, so multiple shooters can be stagered.
  352. */
  353. void() trap_shooter =
  354. {
  355.     trap_spikeshooter ();
  356.     
  357.     if (self.wait == 0)
  358.         self.wait = 1;
  359.     self.nextthink = self.nextthink + self.wait + self.ltime;
  360.     self.think = shooter_think;
  361. };
  362.  
  363.  
  364.  
  365. /*
  366. ===============================================================================
  367.  
  368.  
  369. ===============================================================================
  370. */
  371.  
  372.  
  373. void() make_bubbles;
  374. void() bubble_remove;
  375. void() bubble_bob;
  376.  
  377. /*QUAKED air_bubbles (0 .5 .8) (-8 -8 -8) (8 8 8)
  378.  
  379. testing air bubbles
  380. */
  381.  
  382. void() air_bubbles =
  383.  
  384. {
  385. //        if (deathmatch)
  386. //        {
  387. //                remove (self);
  388. //                return;
  389. //        }
  390.     precache_model ("progs/s_bubble.spr");
  391.     self.nextthink = time + 1;
  392.     self.think = make_bubbles;
  393. };
  394.  
  395. void() make_bubbles =
  396. {
  397. local entity    bubble;
  398.  
  399.     bubble = spawn();
  400.     setmodel (bubble, "progs/s_bubble.spr");
  401.     setorigin (bubble, self.origin);
  402.     bubble.movetype = MOVETYPE_NOCLIP;
  403.     bubble.solid = SOLID_NOT;
  404.     bubble.velocity = '0 0 15';
  405.     bubble.nextthink = time + 0.5;
  406.     bubble.think = bubble_bob;
  407.     bubble.touch = bubble_remove;
  408.     bubble.classname = "bubble";
  409.     bubble.frame = 0;
  410.     bubble.cnt = 0;
  411.     setsize (bubble, '-8 -8 -8', '8 8 8');
  412.     self.nextthink = time + random() + 0.5;
  413.     self.think = make_bubbles;
  414. };
  415.  
  416. void() bubble_split =
  417. {
  418. local entity    bubble;
  419.     bubble = spawn();
  420.     setmodel (bubble, "progs/s_bubble.spr");
  421.     setorigin (bubble, self.origin);
  422.     bubble.movetype = MOVETYPE_NOCLIP;
  423.     bubble.solid = SOLID_NOT;
  424.     bubble.velocity = self.velocity;
  425.     bubble.nextthink = time + 0.5;
  426.     bubble.think = bubble_bob;
  427.     bubble.touch = bubble_remove;
  428.     bubble.classname = "bubble";
  429.     bubble.frame = 1;
  430.     bubble.cnt = 10;
  431.     setsize (bubble, '-8 -8 -8', '8 8 8');
  432.     self.frame = 1;
  433.     self.cnt = 10;
  434.     if (self.waterlevel != 3)
  435.         remove (self);
  436. };
  437.  
  438. void() bubble_remove =
  439. {
  440.     if (other.classname == self.classname)
  441.     {
  442. //        dprint ("bump");
  443.         return;
  444.     }
  445.     remove(self);
  446. };
  447.  
  448. void() bubble_bob =
  449. {
  450. local float        rnd1, rnd2, rnd3;
  451. local vector    vtmp1, modi;
  452.  
  453.         if (self.cnt == 0)
  454.                 if(pointcontents(self.origin)>-2 || pointcontents(self.origin)<-4)
  455.                         remove(self);
  456.     self.cnt = self.cnt + 1;
  457.     if (self.cnt == 4)
  458.         bubble_split();
  459.     if (self.cnt == 20)
  460.         remove(self);
  461.  
  462.     rnd1 = self.velocity_x + (-10 + (random() * 20));
  463.     rnd2 = self.velocity_y + (-10 + (random() * 20));
  464.     rnd3 = self.velocity_z + 10 + random() * 10;
  465.  
  466.     if (rnd1 > 10)
  467.         rnd1 = 5;
  468.     if (rnd1 < -10)
  469.         rnd1 = -5;
  470.         
  471.     if (rnd2 > 10)
  472.         rnd2 = 5;
  473.     if (rnd2 < -10)
  474.         rnd2 = -5;
  475.         
  476.     if (rnd3 < 10)
  477.         rnd3 = 15;
  478.     if (rnd3 > 30)
  479.         rnd3 = 25;
  480.     
  481.     self.velocity_x = rnd1;
  482.     self.velocity_y = rnd2;
  483.     self.velocity_z = rnd3;
  484.         
  485.         if (pointcontents(self.origin) == CONTENT_SOLID)
  486.                 remove(self);
  487.     self.nextthink = time + 0.5;
  488.     self.think = bubble_bob;
  489. };
  490.  
  491. /*~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>
  492. ~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~<~>~*/
  493.  
  494. /*QUAKED viewthing (0 .5 .8) (-8 -8 -8) (8 8 8)
  495.  
  496. Just for the debugging level.  Don't use
  497. */
  498.  
  499. void() viewthing =
  500.  
  501. {
  502.     self.movetype = MOVETYPE_NONE;
  503.     self.solid = SOLID_NOT;
  504.     precache_model ("progs/player.mdl");
  505.     setmodel (self, "progs/player.mdl");
  506. };
  507.  
  508.  
  509. /*
  510. ==============================================================================
  511.  
  512. SIMPLE BMODELS
  513.  
  514. ==============================================================================
  515. */
  516.  
  517. void() func_wall_use =
  518. {    // change to alternate textures
  519.     self.frame = 1 - self.frame;
  520. };
  521.  
  522. /*QUAKED func_wall (0 .5 .8) ?
  523. This is just a solid wall if not inhibitted
  524. */
  525. void() func_wall =
  526. {
  527.     self.angles = '0 0 0';
  528.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  529.     self.solid = SOLID_BSP;
  530.     self.use = func_wall_use;
  531.     setmodel (self, self.model);
  532. };
  533.  
  534.  
  535. /*QUAKED func_illusionary (0 .5 .8) ?
  536. A simple entity that looks solid but lets you walk through it.
  537. */
  538. void() func_illusionary =
  539.  
  540. {
  541.     self.angles = '0 0 0';
  542.     self.movetype = MOVETYPE_NONE;
  543.     self.solid = SOLID_NOT;
  544.     setmodel (self, self.model);
  545.     makestatic ();
  546. };
  547.  
  548. /*QUAKED func_episodegate (0 .5 .8) ? E1 E2 E3 E4
  549. This bmodel will appear if the episode has allready been completed, so players can't reenter it.
  550. */
  551. void() func_episodegate =
  552.  
  553. {
  554.     if (!(serverflags & self.spawnflags))
  555.         return;            // can still enter episode
  556.  
  557.     self.angles = '0 0 0';
  558.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  559.     self.solid = SOLID_BSP;
  560.     self.use = func_wall_use;
  561.     setmodel (self, self.model);
  562. };
  563.  
  564. /*QUAKED func_bossgate (0 .5 .8) ?
  565. This bmodel appears unless players have all of the episode sigils.
  566. */
  567. void() func_bossgate =
  568.  
  569. {
  570.     if ( (serverflags & 15) == 15)
  571.         return;        // all episodes completed
  572.     self.angles = '0 0 0';
  573.     self.movetype = MOVETYPE_PUSH;    // so it doesn't get pushed by anything
  574.     self.solid = SOLID_BSP;
  575.     self.use = func_wall_use;
  576.     setmodel (self, self.model);
  577. };
  578.  
  579. //============================================================================
  580. /*QUAKED ambient_suck_wind (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  581. */
  582. void() ambient_suck_wind =
  583. {
  584.     precache_sound ("ambience/suck1.wav");
  585.     ambientsound (self.origin, "ambience/suck1.wav", 1, ATTN_STATIC);
  586. };
  587.  
  588. /*QUAKED ambient_drone (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  589. */
  590. void() ambient_drone =
  591. {
  592.     precache_sound ("ambience/drone6.wav");
  593.     ambientsound (self.origin, "ambience/drone6.wav", 0.5, ATTN_STATIC);
  594. };
  595.  
  596. /*QUAKED ambient_flouro_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  597. */
  598. void() ambient_flouro_buzz =
  599. {
  600.     precache_sound ("ambience/buzz1.wav");
  601.     ambientsound (self.origin, "ambience/buzz1.wav", 1, ATTN_STATIC);
  602. };
  603. /*QUAKED ambient_drip (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  604. */
  605. void() ambient_drip =
  606. {
  607.     precache_sound ("ambience/drip1.wav");
  608.     ambientsound (self.origin, "ambience/drip1.wav", 0.5, ATTN_STATIC);
  609. };
  610. /*QUAKED ambient_comp_hum (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  611. */
  612. void() ambient_comp_hum =
  613. {
  614.     precache_sound ("ambience/comp1.wav");
  615.     ambientsound (self.origin, "ambience/comp1.wav", 1, ATTN_STATIC);
  616. };
  617. /*QUAKED ambient_thunder (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  618. */
  619. void() ambient_thunder =
  620. {
  621.     precache_sound ("ambience/thunder1.wav");
  622.     ambientsound (self.origin, "ambience/thunder1.wav", 0.5, ATTN_STATIC);
  623. };
  624. /*QUAKED ambient_light_buzz (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  625. */
  626. void() ambient_light_buzz =
  627. {
  628.     precache_sound ("ambience/fl_hum1.wav");
  629.     ambientsound (self.origin, "ambience/fl_hum1.wav", 0.5, ATTN_STATIC);
  630. };
  631. /*QUAKED ambient_swamp1 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  632. */
  633. void() ambient_swamp1 =
  634. {
  635.     precache_sound ("ambience/swamp1.wav");
  636.     ambientsound (self.origin, "ambience/swamp1.wav", 0.5, ATTN_STATIC);
  637. };
  638. /*QUAKED ambient_swamp2 (0.3 0.1 0.6) (-10 -10 -8) (10 10 8)
  639. */
  640. void() ambient_swamp2 =
  641. {
  642.     precache_sound ("ambience/swamp2.wav");
  643.     ambientsound (self.origin, "ambience/swamp2.wav", 0.5, ATTN_STATIC);
  644. };
  645.  
  646. //============================================================================
  647.  
  648. void() noise_think =
  649. {
  650.     self.nextthink = time + 0.5;
  651.     sound (self, 1, "enforcer/enfire.wav", 1, ATTN_NORM);
  652.     sound (self, 2, "enforcer/enfstop.wav", 1, ATTN_NORM);
  653.     sound (self, 3, "enforcer/sight1.wav", 1, ATTN_NORM);
  654.     sound (self, 4, "enforcer/sight2.wav", 1, ATTN_NORM);
  655.     sound (self, 5, "enforcer/sight3.wav", 1, ATTN_NORM);
  656.     sound (self, 6, "enforcer/sight4.wav", 1, ATTN_NORM);
  657.     sound (self, 7, "enforcer/pain1.wav", 1, ATTN_NORM);
  658. };
  659.  
  660. /*QUAKED misc_noisemaker (1 0.5 0) (-10 -10 -10) (10 10 10)
  661.  
  662. For optimzation testing, starts a lot of sounds.
  663. */
  664.  
  665. void() misc_noisemaker =
  666.  
  667. {
  668.     precache_sound2 ("enforcer/enfire.wav");
  669.     precache_sound2 ("enforcer/enfstop.wav");
  670.     precache_sound2 ("enforcer/sight1.wav");
  671.     precache_sound2 ("enforcer/sight2.wav");
  672.     precache_sound2 ("enforcer/sight3.wav");
  673.     precache_sound2 ("enforcer/sight4.wav");
  674.     precache_sound2 ("enforcer/pain1.wav");
  675.     precache_sound2 ("enforcer/pain2.wav");
  676.     precache_sound2 ("enforcer/death1.wav");
  677.     precache_sound2 ("enforcer/idle1.wav");
  678.  
  679.     self.nextthink = time + 0.1 + random();
  680.     self.think = noise_think;
  681. };
  682.